package com.iris.thread.interrupt;

/**
 * 项目: thinking
 * 包名: com.iris.thread.interrupt
 * 作者: victor
 * 日期: 2016年10月31日
 * 说明: InterruptTest
 */
public class InterruptTest implements Runnable{

	public void run() {
		System.out.println("Runnable begin");
		try {
			System.out.println("Runnable sleeping");
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			System.out.println("catch Exception");
			e.printStackTrace();
			//如果没有return，线程不会实际被中断，它会继续打印下面的信息  
			return;
		}
		System.out.println("Runnable end");
		
	}
	
	public static void main(String[] args) {
//		Thread th=new Thread(new InterruptTest());
//		th.start();

		//=====================================================
//		try {
//			System.out.println("Main sleeping");
//			//主线程休眠1秒，从而确保刚才启动的线程有机会执行一段时间  
//			Thread.sleep(1000);
//			System.out.println("Main interrupt");
//			th.interrupt();
//			/**
//			 * interrupt（）该方法只是在目标线程中设置一个标志，表示它已经被中断，并立即返回。
//			 * 这里需要注意的是，如果只是单纯的调用interrupt（）方法，线程并没有实际被中断，会继续往下执行。
//			 */
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		//=====================================================
		
		
		//=====================================================
		/**
		 * 待决中断
		 * 在上面的例子中，sleep（）方法的实现检查到休眠线程被中断，它会相当友好地终止线程，并抛出InterruptedException异常。
		 * 另外一种情况，如果线程在调用sleep（）方法前被中断，那么该中断称为待决中断，它会在刚调用sleep（）方法时，
		 * 立即抛出InterruptedException异常。
		 */
		//如果输入了参数，则在main线程中中断当前线程（亦即main线程）  
        if( args.length == 0 ){  
        	System.out.println("==待决中断========");
        	System.out.println(Thread.currentThread().isInterrupted());
            Thread.currentThread().interrupt();  
        	System.out.println(Thread.currentThread().isInterrupted());
        	//Thread.interrupted()由于它是静态方法，因此不能在特定的线程上使用，而只能报告调用它的线程的中断状态，
        	//与isInterrupted（）不同，它将自动重置中断状态为false，第二次调用Thread.interrupted（）方法，总是返回false，除非中断了线程。
//        	Thread.interrupted();  
//        	System.out.println(Thread.currentThread().isInterrupted());
        }   
        //获取当前时间  
        long startTime = System.currentTimeMillis();  
        try{  
            Thread.sleep(2000);  
            System.out.println("was NOT interrupted");  
        }catch(InterruptedException x){  
            System.out.println("was interrupted");  
        }  
        //计算中间代码执行的时间  
        System.out.println("elapsedTime=" + ( System.currentTimeMillis() - startTime));
        //抛出异常后，会清除中断标志，这里会返回false  
        System.out.println(Thread.currentThread().isInterrupted());
		//=====================================================
	}
	

}
